home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C/C++ Users Group Library 1996 July
/
C-C++ Users Group Library July 1996.iso
/
listings
/
v_09_09
/
9n09108a
< prev
next >
Wrap
Text File
|
1991-07-27
|
2KB
|
98 lines
/**********************************************************
***
*** LISTING 2
***
*** holder.c
***
*** Program to illustrate message passing under QNX.
*** Written and tested under QNX version 2.15C atp
*** Compiler used: Quantum's C compiler
***
*** holder.c is meant to be run in the background and
*** provides the following services to the sender.c
*** (listing 3) program:
***
*** 1) Store a text string.
*** 2) Reply with a previously stored string.
*** 3) Commit suicide.
***
*** The action carried out depends on the value of the
*** header word of the message that sender.c sends to
*** holder.c.
***
**********************************************************/
#include <stdio.h>
#include <task_msgs.h>
#include "message.h"
#define INIT_MSG "*** No stored messages ***"
main(argc, argv)
int argc;
char **argv;
{
unsigned stid; /* Variable to hold
sender's task id. */
unsigned rtid; /* Variable to hold
this task's task id. */
struct message buff, rbuff; /* Message buffers */
extern char Cmd_flags; /* Magic variable */
/*
If any arguments have been passed to this program or if
the program has not been run in background mode, print
a command usage message and exit.
*/
if (argc != 1 || (Cmd_flags & RUN_BACKGROUND) == 0 )
{
printf("\nUsage: holder &\n");
exit(-1);
}
/*
Register a name with the operating system so that other
tasks can find out its task id.
*/
if((rtid = name_attach(HOLDER_NAME, 0)) == 0)
{
printf("\nholder task couldn't attach name\n");
exit(-1);
}
/*
Initialize the reply buffer with an initial text
string.
*/
strcpy(rbuff.text, INIT_MSG);
/*
Now wait for a message. Upon receiving a message,
carry out the appropriate action based on the header
word of the message. Then reply with the result to
the sending task.
*/
for (;;)
{
stid = receive(0, &buff, sizeof(buff) );
switch (buff.mssg_type)
{
case STORE:
strcpy(rbuff.text, buff.text);
rbuff.mssg_type = STORED;
break;
case RETRIEVE:
rbuff.mssg_type = RETRIEVED;
break;
case KILL: /* de-register name & die. */
name_detach(HOLDER_NAME, rtid);
exit(0);
break;
default:
rbuff.mssg_type = ERROR;
break;
}
reply(stid, &rbuff, sizeof(rbuff) );
}
}